package com.kurt.controller;

import com.kurt.annotation.Log;
import com.kurt.common.PageResult;
import com.kurt.common.Result;
import com.kurt.dto.query.SysOperLogQueryRequest;
import com.kurt.entity.SysOperLog;
import com.kurt.service.SysOperLogService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 操作日志控制器
 * 处理操作日志相关的HTTP请求
 */
@Slf4j
@RestController
@RequestMapping("/oper-logs")
@RequiredArgsConstructor
public class SysOperLogController extends BaseController {

    private final SysOperLogService operLogService;

    /**
     * 分页查询操作日志
     *
     * @return 分页结果
     */
    @PostMapping("/page")
    public Result<PageResult<SysOperLog>> getLogsPage(@RequestBody SysOperLogQueryRequest queryDto) {
        try {
            log.info("分页查询操作日志请求: queryDto={}", queryDto);

            Page<SysOperLog> logsPage = operLogService.getLogsPage(queryDto);

            // 转换为PageResult
            PageResult<SysOperLog> pageResult = PageResult.of(
                    queryDto.getPageNum(),
                    queryDto.getPageSize(),
                    logsPage.getTotalElements(),
                    logsPage.getContent()
            );

            return Result.success("分页查询成功", pageResult);
        } catch (Exception e) {
            log.error("分页查询操作日志失败: {}", e.getMessage(), e);
            return Result.error("分页查询失败: " + e.getMessage());
        }
    }

    /**
     * 根据操作人员查询日志
     *
     * @param operName 操作人员
     * @return 日志列表
     */
    @GetMapping("/oper-name/{operName}")
    public Result<List<SysOperLog>> getLogsByOperName(@PathVariable("operName") String operName) {
        try {
            log.info("根据操作人员查询日志请求: {}", operName);
            List<SysOperLog> logs = operLogService.getLogsByOperName(operName);
            return Result.success("查询成功", logs);
        } catch (Exception e) {
            log.error("根据操作人员查询日志失败: {}", e.getMessage(), e);
            return Result.error("查询失败: " + e.getMessage());
        }
    }

    /**
     * 根据业务类型查询日志
     *
     * @param businessType 业务类型
     * @return 日志列表
     */
    @GetMapping("/business-type/{businessType}")
    public Result<List<SysOperLog>> getLogsByBusinessType(@PathVariable("businessType") Integer businessType) {
        try {
            log.info("根据业务类型查询日志请求: {}", businessType);
            List<SysOperLog> logs = operLogService.getLogsByBusinessType(businessType);
            return Result.success("查询成功", logs);
        } catch (Exception e) {
            log.error("根据业务类型查询日志失败: {}", e.getMessage(), e);
            return Result.error("查询失败: " + e.getMessage());
        }
    }

    /**
     * 根据操作状态查询日志
     *
     * @param status 操作状态
     * @return 日志列表
     */
    @GetMapping("/status/{status}")
    public Result<List<SysOperLog>> getLogsByStatus(@PathVariable("status") Integer status) {
        try {
            log.info("根据操作状态查询日志请求: {}", status);
            List<SysOperLog> logs = operLogService.getLogsByStatus(status);
            return Result.success("查询成功", logs);
        } catch (Exception e) {
            log.error("根据操作状态查询日志失败: {}", e.getMessage(), e);
            return Result.error("查询失败: " + e.getMessage());
        }
    }

    /**
     * 根据时间范围查询日志
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 日志列表
     */
    @GetMapping("/time-range")
    public Result<List<SysOperLog>> getLogsByTimeRange(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
        try {
            log.info("根据时间范围查询日志请求: startTime={}, endTime={}", startTime, endTime);
            List<SysOperLog> logs = operLogService.getLogsByTimeRange(startTime, endTime);
            return Result.success("查询成功", logs);
        } catch (Exception e) {
            log.error("根据时间范围查询日志失败: {}", e.getMessage(), e);
            return Result.error("查询失败: " + e.getMessage());
        }
    }

    /**
     * 根据操作人员和时间范围查询日志
     *
     * @param operName  操作人员
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 日志列表
     */
    @GetMapping("/oper-name/{operName}/time-range")
    public Result<List<SysOperLog>> getLogsByOperNameAndTimeRange(
            @PathVariable("operName") String operName,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
        try {
            log.info("根据操作人员和时间范围查询日志请求: operName={}, startTime={}, endTime={}", operName, startTime, endTime);
            List<SysOperLog> logs = operLogService.getLogsByOperNameAndTimeRange(operName, startTime, endTime);
            return Result.success("查询成功", logs);
        } catch (Exception e) {
            log.error("根据操作人员和时间范围查询日志失败: {}", e.getMessage(), e);
            return Result.error("查询失败: " + e.getMessage());
        }
    }

    /**
     * 清理指定时间之前的日志
     *
     * @param operTime 操作时间
     * @return 清理结果
     */
    @Log(title = "清理指定时间之前的日志", businessType = 3)
    @DeleteMapping("/clean")
    public Result<Integer> cleanLogsBefore(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime operTime) {
        try {
            log.info("清理操作日志请求: operTime={}", operTime);
            int count = operLogService.cleanLogsBefore(operTime);
            return Result.success("清理成功", count);
        } catch (Exception e) {
            log.error("清理操作日志失败: {}", e.getMessage(), e);
            return Result.error("清理失败: " + e.getMessage());
        }
    }

    /**
     * 根据ID获取日志详情
     *
     * @param id 日志ID
     * @return 日志详情
     */
    @GetMapping("/{id}")
    public Result<SysOperLog> getLogById(@PathVariable("id") String id) {
        try {
            log.info("获取日志详情请求: {}", id);
            SysOperLog log = operLogService.getById(id);
            return Result.success("获取成功", log);
        } catch (Exception e) {
            log.error("获取日志详情失败: {}", e.getMessage(), e);
            return Result.error("获取失败: " + e.getMessage());
        }
    }
}
